home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 1999 August / SGI Freeware 1999 August.iso / dist / fw_kdelibs.idb / usr / freeware / kde / include / ksock.h.z / ksock.h
Encoding:
C/C++ Source or Header  |  1999-01-26  |  8.5 KB  |  329 lines

  1. /* This file is part of the KDE libraries
  2.     Copyright (C) 1997 Torben Weis (weis@kde.org)
  3.  
  4.     This library is free software; you can redistribute it and/or
  5.     modify it under the terms of the GNU Library General Public
  6.     License as published by the Free Software Foundation; either
  7.     version 2 of the License, or (at your option) any later version.
  8.  
  9.     This library is distributed in the hope that it will be useful,
  10.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12.     Library General Public License for more details.
  13.  
  14.     You should have received a copy of the GNU Library General Public License
  15.     along with this library; see the file COPYING.LIB.  If not, write to
  16.     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  17.     Boston, MA 02111-1307, USA.
  18. */
  19.  
  20. /*
  21.  * $Id: ksock.h,v 1.17 1998/03/28 11:02:08 kulow Exp $
  22.  *
  23.  * $Log: ksock.h,v $
  24.  * Revision 1.17  1998/03/28 11:02:08  kulow
  25.  * undef NULL for egcs's sake
  26.  *
  27.  * Revision 1.16  1998/03/26 22:06:41  torben
  28.  * Torben: Little bug fix in copy constructor
  29.  *
  30.  * Revision 1.15  1998/01/24 11:13:58  kulow
  31.  * changed the order of the header files
  32.  *
  33.  * Revision 1.14  1998/01/24 00:12:02  kulow
  34.  * added sys/socket.h
  35.  *
  36.  * Revision 1.13  1998/01/23 02:23:40  torben
  37.  * Torben: Supports UNIX domain sockets now.
  38.  *
  39.  * Revision 1.12  1998/01/18 14:39:05  kulow
  40.  * reverted the changes, Jacek commited.
  41.  * Only the RCS comments were affected, but to keep them consistent, I
  42.  * thought, it's better to revert them.
  43.  * I checked twice, that only comments are affected ;)
  44.  *
  45.  * Revision 1.10  1997/12/18 01:56:25  torben
  46.  * Torben: Secure string operations. Use instead of QString::sprintf
  47.  *
  48.  * Revision 1.9  1997/10/21 20:44:53  kulow
  49.  * removed all NULLs and replaced it with 0L or "".
  50.  * There are some left in mediatool, but this is not C++
  51.  *
  52.  * Revision 1.8  1997/10/16 11:15:03  torben
  53.  * Kalle: Copyright headers
  54.  * kdoctoolbar removed
  55.  *
  56.  * Revision 1.7  1997/09/18 12:16:05  kulow
  57.  * corrected some header dependencies. Removed most of them in drag.h and put
  58.  * them in drag.cpp. Now it should compile even under SunOS 4.4.1 ;)
  59.  *
  60.  * Revision 1.6  1997/08/30 08:32:56  kdecvs
  61.  * Coolo: changed the location of the include files to get rid of the
  62.  * hardcoded HAVE_STDC_HEADERS
  63.  *
  64.  * Revision 1.5  1997/07/27 13:43:59  kalle
  65.  * Even more SGI and SCC patches, security patch for kapp, various fixes for ksock
  66.  *
  67.  * Revision 1.4  1997/07/25 19:46:43  kalle
  68.  * SGI changes
  69.  *
  70.  * Revision 1.3  1997/07/18 05:49:18  ssk
  71.  * Taj: All kdecore doc now in javadoc format (hopefully).
  72.  *
  73.  * Revision 1.2  1997/06/25 14:22:13  ssk
  74.  * Taj: updated some documentation.
  75.  *
  76.  * Revision 1.1.1.1  1997/04/13 14:42:42  cvsuser
  77.  * Source imported
  78.  *
  79.  * Revision 1.1.1.1  1997/04/09 00:28:07  cvsuser
  80.  * Sources imported
  81.  *
  82.  * Revision 1.4  1997/01/15 20:34:14  kalle
  83.  * merged changes from 0.52
  84.  *
  85.  * Revision 1.3  1996/12/07 22:23:07  kalle
  86.  * autoconf, documentation
  87.  *
  88.  * Revision 1.2  1996/12/07 18:32:00  kalle
  89.  * RCS header
  90.  *
  91.  *
  92.  * The KDE Socket Classes.
  93.  *
  94.  * Torben Weis
  95.  * weis@stud.uni-frankfurt.de
  96.  *
  97.  * Part of the KDE Project.
  98.  */
  99.  
  100. #ifndef KSOCK_H
  101. #define KSOCK_H
  102.  
  103. #ifdef HAVE_CONFIG_H
  104. #include <config.h>
  105. #endif
  106.  
  107. #ifdef NULL
  108. #undef NULL
  109. #endif
  110. #define NULL 0
  111.  
  112. #include <sys/types.h>
  113. #include <sys/socket.h> 
  114. #include <sys/un.h>
  115. #include <netinet/in.h>
  116.  
  117. #include <qsocknot.h>
  118.  
  119. /** 
  120.  * A TCP/IP client socket. You can connect this socket to any internet address. 
  121.  *
  122.  * The socket gives you three signals: When ready for reading/writing or 
  123.  * if the connection is broken.  Using socket() you get a file descriptor
  124.  * which you can use with usual unix commands like write(..) or read(...). 
  125.  * If you have already such a socket identifier you can construct a KSocket
  126.  * on this identifier. 
  127.  *  
  128.  * If socket() delivers a value of -1 or less, the connection 
  129.  * had no success.
  130.  *
  131.  * @author Torben Weis <weis@uni-frankfurt.de>
  132.  * @version $Id: ksock.h,v 1.17 1998/03/28 11:02:08 kulow Exp $
  133.  * @short a TCP/IP client socket.
  134.  */
  135. class KSocket : public QObject
  136. {
  137.     Q_OBJECT
  138. public:
  139.     /** 
  140.      * Create a KSocket with the provided file descriptor.
  141.      * @param _sock    the file descriptor to use.
  142.      */
  143.     KSocket( int _sock ) { sock = _sock; readNotifier = 0L; writeNotifier = 0L; }
  144.     
  145.     /** 
  146.      * Create a socket and connect to a host.
  147.      * @param _host    the remote host to which to connect.
  148.      * @param _port    the port on the remote host.
  149.      */
  150.     KSocket( const char *_host, unsigned short int _port );
  151.     
  152.     /** 
  153.      * Connects to a UNIX domain socket.
  154.      * @param _path    the filename of the socket
  155.      */
  156.     KSocket( const char *_path );
  157.  
  158.     /** 
  159.      * Destructor. Closes the socket if it is still open.
  160.      */
  161.     ~KSocket();
  162.     
  163.     /** 
  164.      * Returns a file descriptor for this socket.
  165.      */
  166.     int socket() const { return sock; }
  167.     
  168.     /** 
  169.      * Enable the socket for reading.
  170.      *
  171.      * If you enable read mode, the socket will emit the signal
  172.      * readEvent whenever there is something to read out of this
  173.      * socket.
  174.      */
  175.     void enableRead( bool );
  176.     
  177.     /** 
  178.      * Enable the socket for writing.
  179.      *
  180.      * If you enable write mode, the socket will emit the signal
  181.      * writeEvent whenever the socket is ready for writing.
  182.      */
  183.     void enableWrite( bool );
  184.     
  185.     /**
  186.      * Return address.
  187.      */
  188.     unsigned long getAddr();
  189.     
  190. signals:
  191.     /** 
  192.      * Data has arrived for reading.
  193.      *
  194.      * This signal will only be raised if enableRead( TRUE ) was called
  195.      * first.
  196.      */
  197.     void readEvent( KSocket * );
  198.     
  199.     /** 
  200.      * Socket is ready for writing.
  201.      *
  202.      * This signal will only be raised if enableWrite( TRUE ) was called
  203.      * first.
  204.      */
  205.     void writeEvent( KSocket * );
  206.     
  207.     /** 
  208.      * Raised when the connection is broken.
  209.      */
  210.     void closeEvent( KSocket * );
  211.     
  212. public slots:
  213.     /** 
  214.      * Connected to the writeNotifier.
  215.      */
  216.     void slotWrite( int );
  217.     
  218.     /** 
  219.      * Connected to the readNotifier.
  220.      */
  221.     void slotRead( int );
  222.     
  223. protected:
  224.     bool connect( const char *_host, unsigned short int _port );
  225.     bool connect( const char *_path );
  226.   
  227.     bool init_sockaddr( const char *hostname, unsigned short int port );
  228.     
  229.     struct sockaddr_in server_name;
  230.     struct sockaddr_un unix_addr;
  231.  
  232.     /******************************************************
  233.      * The file descriptor for this socket. sock may be -1.
  234.      * This indicates that it is not connected.
  235.      */
  236.     int sock;
  237.  
  238.     int domain;
  239.   
  240.     QSocketNotifier *readNotifier;
  241.     QSocketNotifier *writeNotifier;
  242. };
  243.  
  244.  
  245. /**
  246.  * Monitor a port for incoming TCP/IP connections.
  247.  *
  248.  * You can use a KServerSocket to listen on a port for incoming
  249.  * connections. When a connection arrived in the port, a KSocket
  250.  * is created and the signal accepted is raised. Make sure you
  251.  * always connect to this signal. If you dont the ServerSocket will
  252.  * create new KSocket's and no one will delete them!
  253.  *
  254.  * If socket() is -1 or less the socket was not created properly.
  255.  *
  256.  * @author Torben Weis <weis@stud.uni-frankfurt.de>
  257.  * @version $Id: ksock.h,v 1.17 1998/03/28 11:02:08 kulow Exp $
  258.  * @short Monitor a port for incoming TCP/IP connections.
  259. */
  260. class KServerSocket : public QObject
  261. {
  262.     Q_OBJECT
  263. public:
  264.     /**
  265.      * Constructor.
  266.      * @param _port    the port number to monitor for incoming connections.
  267.      */
  268.     KServerSocket( int _port );
  269.  
  270.     /**
  271.      * Creates a UNIX domain server socket.
  272.      */
  273.     KServerSocket( const char *_path );
  274.   
  275.     /** 
  276.      * Destructor. Closes the socket if it was not already closed.
  277.      */
  278.     ~KServerSocket();
  279.     
  280.     /** 
  281.      * Get the file descriptor assoziated with the socket.
  282.      */
  283.     int socket() const { return sock; }
  284.  
  285.     /** 
  286.      * Returns the port number which is being monitored.
  287.      */
  288.     unsigned short getPort();
  289.  
  290.     /** 
  291.      * The address.
  292.      */
  293.     unsigned long getAddr();
  294.  
  295. public slots: 
  296.     /** 
  297.      * Called when someone connected to our port.
  298.      */
  299.     virtual void slotAccept( int );
  300.  
  301. signals:
  302.     /**
  303.      * A connection has been accepted.
  304.      * It is your task to delete the KSocket if it is no longer needed.
  305.      */
  306.     void accepted( KSocket* );
  307.  
  308. protected:
  309.     bool init( short unsigned int );
  310.     bool init( const char* _path );
  311.   
  312.     /** 
  313.      * Notifies us when there is something to read on the port.
  314.      */
  315.     QSocketNotifier *notifier;
  316.     
  317.     /** 
  318.      * The file descriptor for this socket. sock may be -1.
  319.      * This indicates that it is not connected.
  320.      */    
  321.     int sock;  
  322.  
  323.     int domain;
  324. };
  325.  
  326. #endif
  327.  
  328.  
  329.